import java.util.Scanner;

public class ClimbingStairs {
    /**
     * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
     * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？
     * 注意：给定 n 是一个正整数。
     * @param n
     * @return
     * 解题思路 动态规划 f(n) = f(n-1)+f(n-2)
     */
    public static int climbStairs(int n) {
        if (n==1){
            return 1;
        }
        if (n==2){
            return 2;
        }
//        return climbStairs(n-1)+climbStairs(n-2);
        int[] arr1 = new int[n]; //存储f(n)中f(1)的参数项
        int[] arr2 = new  int[n]; //存储f(n)中f(2)的参数项
        arr1[0] =1;
        arr2[0] =0;
        arr1[1] =0;
        arr2[1] =1;
        for (int i=2;i<n;i++){
            arr1[i] = arr1[i-1]+arr1[i-2];
            arr2[i] = arr2[i-1]+arr2[i-2];
        }
        return arr1[n-1]+2*arr2[n-1];

    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.printf("总共有%d个台阶\n",n);
        System.out.printf("总共有%d总解法\n",climbStairs(n));

    }
}
